Pytorch笔记:维度dim的定义及其理解使用 您所在的位置:网站首页 model please是什么意思 Pytorch笔记:维度dim的定义及其理解使用

Pytorch笔记:维度dim的定义及其理解使用

2024-03-28 18:22| 来源: 网络整理| 查看: 265

一、dim的定义

TensorFlow对张量的阶、维度、形状有着明确的定义,而在pytorh中对其的定义却模糊不清,仅仅有一个torch.size()的函数来查看张量的大小(我理解的这个大小指的就是TensorFlow对张量的形状描述,也和numpy的.shape类似)。所以,首先要搞清楚如何看一个张量的形状。

import torch z = torch.ones(2,3,4) print(z) print(z.size()) print(z.size(0)) print(z.size(1)) print(z.size(2))

以上代码的控制台输出为:

tensor([[[1., 1., 1., 1.], [1., 1., 1., 1.], [1., 1., 1., 1.]], [[1., 1., 1., 1.], [1., 1., 1., 1.], [1., 1., 1., 1.]]]) torch.Size([2, 3, 4]) 2 3 4

可见,我们成功创建了一个(2,3,4)大小的张量,那么我们人工应该怎么辨别一个张量的大小呢?为了直观,我把这个张量的中括号调整一个位置:

[ [ [1., 1., 1., 1.], [1., 1., 1., 1.], [1., 1., 1., 1.] ], [ [1., 1., 1., 1.], [1., 1., 1., 1.], [1., 1., 1., 1.] ] ]

我们可以看到:

第一层(最外层)中括号里面包含了两个中括号(以逗号进行分割),这就是(2,3,4)中的2 第二层中括号里面包含了三个中括号(以逗号进行分割),这就是(2,3,4)中的3 第三层中括号里面包含了四个数(以逗号进行分割),这就是(2,3,4)中的4 结论:pytorch中的tensor维度可以通过第一个数前面的中括号数量来判断,有几个中括号维度就是多少。拿到一个维度很高的向量,将最外层的中括号去掉,数最外层逗号的个数,逗号个数加一就是最高维度的维数,如此循环,直到全部解析完毕。 我们还看到:

z.size(0) = 2,z.size(1) = 3,z.size(2) = 4

第0维度为2,第1维度为3,第2维度为4,即维度的标号是以0开始的 以上定义部分,摘自:pytorch中对维度及其squeeze()、unsqueeze()函数的理解

二、dim 的理解

网上很多对dim的理解,比如,dim=0,表示的是行,函数的意思就是不要行这一维度,保留列巴拉巴拉之类的,个人觉得不好理解。比如下图博主的理解 在这里插入图片描述 那我的理解就是:

控制变量法大家知道吗??或者消融实验?就是几个方法或者实验的比较,保持只有一个因素是可变的,其他都是一致的,就是控制变量法,论文术语也叫消融实验。

所以,dim的使用也是这样,只有dim指定的维度是可变的,其他都是固定不变的。

dim = 0,指定的是行,那就是列不变,理解成:同一列中每一行之间的比较或者操作,是每一行的比较,因为行是可变的。

example:

1. torch.argmax(): 得到最大值的序号索引

a = torch.rand((3,4)) print(a) b = torch.argmax(a, dim=1) ##指定列,也就是行不变,列之间的比较 print(b) >>tensor([[0.8338, 0.6953, 0.7558, 0.5803], [0.2105, 0.7638, 0.0912, 0.3341], [0.5585, 0.8019, 0.6590, 0.2268]]) >>tensor([0, 1, 1])

说明:dim=1,指定列,也就是行不变,列之间的比较,所以原来的a有三行,最后argmax()出来的应该也是三个值,第一行的时候,同一列之间比较,最大值是0.8338,索引是0,同理,第二行,最大值的索引是1……

2. sum(): 求和

a = t.arange(0,6).view(2,3) a >>tensor([[0, 1, 2], [3, 4, 5]]) a.sum() a.sum(dim=0) #指定行,行是可变的,列是不变的 a.sum(dim=1) >>tensor(15.) >>tensor([3., 5., 7.]) >>tensor([ 3., 12.])

说明:dim=0,指定行,行是可变的,列是不变,所以就是同一列中,每一个行的比较,所以a.sum(dim = 0),第一列的和就是3,第二列的和就是5,第三列的和就是7. 同理,a.sum(dim=1),指定列,列是可变的,行是不变的,所以就是同一列之间的比较或者操作,所以第一行的求和是3,第二行的求和是12

3. cumsum(): 累加

a = t.arange(0,6).view(2,3) a >>tensor([[0, 1, 2], [3, 4, 5]]) a.cumsum(dim=0) # 指定行,列不变,行变,从第一行到最后一行的累加 >>tensor([[0, 1, 2], [3, 5, 7]]) a.cumsum(dim=1) # 指定列,行不变,列变,从第一列到最后一列的累加 >>tensor([[ 0, 1, 3], [ 3, 7, 12]])

注:目前见过的,这种理解成控制变量法还是大多可以很好的解释过去,如果有不能用我这种的解决的,麻烦底下告诉我一下,互相学习,共同进步。

更新2021.10.13

有大半年没有更新博客了,这段时间一直准备春招,实习,秋招,到今天基本上可以结束坐等开奖了; 目前手里有近10个CV算法工程师意向书:字节,商汤,百度,顺丰,华为,小红书,拼多多,小马智行,海康威视,腾讯等。 接下来会花很多时间在小红书上整理这一过程所有的经验以及技巧,包括:丰富简历内容,如何打比赛(大佬止步),如何刷题,刷什么题,刷到什么程度,面试技巧,面经整理,hr面技巧,如何反问面试官,如何argue薪资等等等,大家有需要可以关注一波哈,内容保证丰富!助力大家秋招收割offer到手软!

大家如果是刚研一或者已经研二或者是大二或者大三赶紧关注一波,关注我秋招不踩坑!

小红书号:371845174(Activewaste,博客同名)

后面也会在小红书分享好用工具,插件,装逼神器等,手把手教学,大家关注起来哈! 我看有粉丝评论私信求更新的,大受鼓舞哈哈哈哈,后面会继续更新论文笔记,供大家参考互相学习!!! 另外我比较少上csdn,大家给我私信要联系方式或者评论问问题有时没看到(一个月没上,200+的通知),大家直接去小红书私信提问,或者催我撒!

在这里插入图片描述



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有